import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth' // 引入处理token的三种方法
import { login, getUserInfo, getUserDetailBayId } from '@/api/user' // 引入封装好的登录接口
import { resetRouter } from '@/router'
const state = {
  token: getToken(), // 设置token为共享状态 初始化vuex的时候就在缓存中去读取
  userInfo: {} // 用户信息
}

const mutations = {
  // 存储token
  setToken(state, token) {
    state.token = token // 将数据设置给vuex
    setToken(token)// 同步给缓存
  },
  // 删除token
  removeToken(state) {
    state.token = null // 将vuex中的token置空
    removeToken() // 删除缓存中的token
  },
  // 修改用户信息
  setUserInfo(state, res) {
    state.userInfo = res
  },
  // 删除用户信息
  removeUserInfo(state) {
    state.userInfo = {}
  }

}

const actions = {
  async login(context, data) {
    // 调用api的接口
    const res = await login(data) // 拿到token 登录成功
    // 提交mutation
    context.commit('setToken', res) // 提交token
    setTimeStamp() // 设置当前的时间戳
  },
  // 获取个人信息
  async getUserInfo(context) {
    const res = await getUserInfo() // 获取个人信息
    const baseInfo = await getUserDetailBayId(res.userId) // 获取用户详情
    context.commit('setUserInfo', { ...res, ...baseInfo }) // 提交token
    return res // 后期做权限的时候埋下伏笔
  },
  // 实现等登出
  logout(context) {
    // 删除token和用户资料
    context.commit('removeToken')
    context.commit('removeUserInfo')
    // 重置路由
    resetRouter()
    // 设置权限模块下的路由为初始状态
    // 子模块调用子模块的actions 都没有加锁的情况下
    // 加了命名空间的子模块怎么掉另外一个加了命名空间的actions
    // 加了命名的context不是全局的context
    // 子模块调用子模块的action 可以 将 commit的第三个参数 设置成  { root: true } 就表示当前的context不是子模块了 而是父模块
    // { root: true }调用根级的actions
    context.commit('permission/setRoutes', [], { root: true })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

